package com.rightrule.sequence;

import com.rightrule.sequence.enums.SequenceEnum;

/**
 * @author: xry
 * @version: SequenceService.java 2024/9/6 19:56
 */
public interface SequenceService {

    /**
     * 生成没有业务含义的SEQ
     * 不分库的情况下使用
     * 共22位：日期8位 + '10' + 分库分表位（00）+ 随机位（00）+ seq（8位）
     *
     * @param sequenceEnum
     * @return
     */
    String createKeyNoWithoutSharding(SequenceEnum sequenceEnum);

    /**
     * 生成一个没有业务含义的编号
     * 分库的情况下使用
     * 共22位：日期8位 + '10' + 分库分表位（2位）+ 随机位（00）+ seq（8位）
     *
     * @param custId       客户编号，分库分表位由它产生
     * @param sequenceEnum SEQ枚举
     * @return string
     */
    String createKeyNo(String custId, SequenceEnum sequenceEnum);

    /**
     * 通过客户编号和事件码来生成业务流水号
     * 分库的情况下使用
     * 共40位，主要用于需要跨系统传递的业务流水号
     * 日期8位 + '10' + 业务事件码（8位）+ 业务扩展位（10位）+ 分库分表位（2位）+ 随机位（2位）+ seq（8位）
     *
     * @param custId       客户编号，分库分表位由它产生
     * @param eventCode    业务事件码
     * @param bizExt       业务扩展位
     * @param sequenceEnum SEQ枚举
     * @return string
     */
    String createBizNo(String custId, String eventCode, String bizExt, SequenceEnum sequenceEnum);

    /**
     * 企业开户设置渠道流水号
     *
     * @param ipId
     * @param eventCode
     * @param bizExt
     * @param sequenceEnum
     * @return
     */
    String createBizIpId(String ipId, String eventCode, String bizExt, SequenceEnum sequenceEnum);
}
